#ifndef __WIZ_BNF_OPEATORS_HPP__SHANHAOBO_19800429__
#define __WIZ_BNF_OPEATORS_HPP__SHANHAOBO_19800429__

/// Backus-Naur Form
#include "./Parser/WizBNFParserPredefined.hpp"

namespace Wiz
{
    namespace BNF
    {
        //////////////////////////////////////////////////////////////////////////
        /// KleeneStar
        //////////////////////////////////////////////////////////////////////////
        template <typename S>
        WIZ_INLINE ::Wiz::BNF::Parser::KleeneStar::Type<S>
            operator*(::Wiz::BNF::Parser::Type<S> const& Sbjct)
        {
            return ::Wiz::BNF::Parser::Predef::KleeneStar(Sbjct);
        }

        //////////////////////////////////////////////////////////////////////////
        /// Alternative
        //////////////////////////////////////////////////////////////////////////
        template <typename LeftT, typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Alternative::Type<LeftT, RightT>
            operator|(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Alternative(Lft, Rght);
        }

        //////////////////////////////////////////////////////////////////////////
        /// Sequence
        //////////////////////////////////////////////////////////////////////////
        template <typename LeftT, typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<LeftT, RightT>
            operator>>(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename LeftT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<LeftT, ::Wiz::BNF::Parser::Char::Check::Type<::Wiz::Char::Type>>
            operator>>(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::Char::Type Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<::Wiz::BNF::Parser::Char::Check::Type<::Wiz::Char::Type>, RightT>
            operator>>(::Wiz::Char::Type Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename LeftT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<LeftT, ::Wiz::BNF::Parser::String::Type<::Wiz::Char::Type const*>>
            operator>>(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::Char::Type const* Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<::Wiz::BNF::Parser::String::Type<::Wiz::Char::Type const*>, RightT>
            operator>>(::Wiz::Char::Type const* Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename LeftT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<LeftT, ::Wiz::BNF::Parser::Char::Check::Type<::Wiz::WChar::Type>>
            operator>>(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::WChar::Type Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<::Wiz::BNF::Parser::Char::Check::Type<::Wiz::WChar::Type>, RightT>
            operator>>(::Wiz::WChar::Type Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename LeftT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<LeftT, ::Wiz::BNF::Parser::String::Type<::Wiz::WChar::Type const*>>
            operator>>(::Wiz::BNF::Parser::Type<LeftT> const& Lft, ::Wiz::WChar::Type const* Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        template <typename RightT>
        WIZ_INLINE ::Wiz::BNF::Parser::Sequence::Type<::Wiz::BNF::Parser::String::Type<::Wiz::WChar::Type const*>, RightT>
            operator>>(::Wiz::WChar::Type const* Lft, ::Wiz::BNF::Parser::Type<RightT> const& Rght)
        {
            return ::Wiz::BNF::Parser::Predef::Sequence(Lft, Rght);
        }

        //////////////////////////////////////////////////////////////////////////
        /// Positive
        //////////////////////////////////////////////////////////////////////////
        template <typename S>
        WIZ_INLINE ::Wiz::BNF::Parser::Positive::Type<S>
            operator+(::Wiz::BNF::Parser::Type<S> const& Sbjct)
        {
            return ::Wiz::BNF::Parser::Predef::Positive(Sbjct);
        }

    } /// end of namespace BNF
} /// end of namespace BNF
//////////////////////////////////////////////////////////////////////////
/// Actor
//////////////////////////////////////////////////////////////////////////

#endif /*__WIZ_BNF_OPEATORS_HPP__SHANHAOBO_19800429__*/
